#include <stdio.h>
#include <mysql/mysql.h>
#include <stdlib.h>


int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        exit(EXIT_FAILURE);
    }

    // 连接数据库
    if (mysql_real_connect(conn, "localhost", "root", "123456", 
                          "student", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);  // 修复：conn可能为NULL，但mysql_close允许传入NULL
        exit(EXIT_FAILURE);
    }

    printf("成功连接到MySQL数据库！\n");


    // 查询t_student表
    const char *sql = "SELECT name,age,birthday FROM t_student";
    if (mysql_query(conn, sql) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        
        // 显示当前数据库中的所有表
        if (mysql_query(conn, "SHOW TABLES") == 0) {
            MYSQL_RES *tables = mysql_store_result(conn);
            printf("当前数据库(student)中的表:\n");
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(tables))) {
                printf("- %s\n", row[0]);
            }
            mysql_free_result(tables);
        }
        
        mysql_close(conn);
        exit(EXIT_FAILURE);
    }

    MYSQL_RES *result = mysql_store_result(conn);
    if (result == NULL) {
        fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        exit(EXIT_FAILURE);
    }

    // 获取结果集行数和列数
    int num_fields = mysql_num_fields(result);
    MYSQL_ROW row;

    // 输出表头
    MYSQL_FIELD *field;
    while ((field = mysql_fetch_field(result))) {
        printf("%s\t", field->name);
    }
    printf("\n");

    // 输出数据行
    while ((row = mysql_fetch_row(result))) {
        for (int i = 0; i < num_fields; i++) {
            printf("%s\t", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    // 释放结果集并关闭连接
    mysql_free_result(result);
    mysql_close(conn);

    return 0;
}